--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
meshchatx/src/backend/archiver_manager.py fa46dc4ce9ab50cbe66a7a9e4b3bca0140102345 (fa46dc4c) Text, 2.03 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72import T7ee787hashlib
Tff7b72from T7ee787.T7ee787database Tff7b72import Te6edf3Database
Tff7b72class T56d364ArchiverManagerTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dbTb4b4b4: Te6edf3DatabaseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdb Tff7b72= Te6edf3db
Tff7b72def Td2a8ffarchive_pageTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3destination_hashTb4b4b4,
Te6edf3page_pathTb4b4b4,
Te6edf3contentTb4b4b4,
Te6edf3max_versionsTff7b72=T79c0ff5Tb4b4b4,
Te6edf3max_storage_gbTff7b72=T79c0ff1Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3content_hash Tff7b72= Te6edf3hashlibTff7b72.Td2a8ffsha256Tb4b4b4(Te6edf3contentTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffhexdigestTb4b4b4(Tb4b4b4)
T8b949e# Check if already exists
Te6edf3existing Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT id FROM archived_pages WHERE destination_hash = ? AND page_path = ? AND hash = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3page_pathTb4b4b4, Te6edf3content_hashTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3existingTb4b4b4:
Tff7b72return
T8b949e# Insert new version
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmiscTff7b72.Td2a8ffarchive_pageTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3page_pathTb4b4b4, Te6edf3contentTb4b4b4, Te6edf3content_hashTb4b4b4)
T8b949e# Enforce max versions per page
Te6edf3versions Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmiscTff7b72.Td2a8ffget_archived_page_versionsTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3page_pathTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3versionsTb4b4b4) Tff7b72> Te6edf3max_versionsTb4b4b4:
T8b949e# Delete older versions
Te6edf3to_delete Tff7b72= Te6edf3versionsTb4b4b4[Te6edf3max_versionsTb4b4b4:Tb4b4b4]
Tff7b72for Te6edf3version Tff7b72in Te6edf3to_deleteTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8ffexecuteTb4b4b4(
Ta5d6ff"Ta5d6ffDELETE FROM archived_pages WHERE id = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3versionTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e# Enforce total storage limit (approximate)
Te6edf3total_size_row Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT SUM(LENGTH(content)) as total_size FROM archived_pagesTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3total_size Tff7b72= Te6edf3total_size_rowTb4b4b4[Ta5d6ff"Ta5d6fftotal_sizeTa5d6ff"Tb4b4b4] Tff7b72or T79c0ff0
Te6edf3max_bytes Tff7b72= Te6edf3max_storage_gb Tff7b72* T79c0ff1024 Tff7b72* T79c0ff1024 Tff7b72* T79c0ff1024
Tff7b72while Te6edf3total_size Tff7b72> Te6edf3max_bytesTb4b4b4:
Te6edf3oldest Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT id, LENGTH(content) as size FROM archived_pages ORDER BY created_at ASC LIMIT 1Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3oldestTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8ffexecuteTb4b4b4(
Ta5d6ff"Ta5d6ffDELETE FROM archived_pages WHERE id = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3oldestTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3total_size Tff7b72-Tff7b72= Te6edf3oldestTb4b4b4[Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72break
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────